package com.online.demo.controller;


import com.alipay.api.AlipayClient;
import com.alipay.api.DefaultAlipayClient;
import com.alipay.api.domain.AlipayTradePagePayModel;
import com.alipay.api.request.AlipayOpenPublicTemplateMessageIndustryModifyRequest;
import com.alipay.api.request.AlipayTradePagePayRequest;
import com.alipay.api.request.AlipayTradePayRequest;
import com.alipay.api.response.AlipayOpenPublicTemplateMessageIndustryModifyResponse;
import com.alipay.api.response.AlipayTradePagePayResponse;
import com.alipay.api.response.AlipayTradePayResponse;
import com.online.demo.common.ResultBean;
import com.online.demo.entity.TContent;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestMapping;

import org.springframework.web.bind.annotation.RestController;

import javax.servlet.http.HttpServletResponse;

/**
 * <p>
 *  前端控制器
 * </p>
 *
 * @author sda1
 * @since 2020-11-30
 */
@RestController
@RequestMapping("/order")
public class TOrderController {
    
    private String pri_key;
    private String pub_key;
    private String app_id;



    // 支付宝支付接口
    @PostMapping("payForAliBaba")
    public void payForAliBaba(HttpServletResponse response) throws Exception{
        //实例化客户端
        AlipayClient alipayClient = new DefaultAlipayClient(
                "https://openapi.alipaydev.com/gateway.do",        // 支付宝 支付网关接口 固定值
                app_id,                               // appid 在支付宝管理页面查看
                pri_key,                                                // 私钥     -- 开发者助手的私钥
                "json",                                          // 数据格式类型
                "utf-8",                                         // 字符类型
                pub_key,                                                // 支付宝公钥 -- 通过开发者助手生成应用公钥 然后在页面生成支付宝公钥
                "RSA2");                                       // 加密方式

        // 文档链接 https://opendocs.alipay.com/apis/api_1/alipay.trade.page.pay
        // 支付请求参数构造
        // 支付页面接口
        AlipayTradePagePayRequest aliRequest = new AlipayTradePagePayRequest ();

        // 这里需要的是外网的接口
        // 如果是内网则需要部署内网穿透
        aliRequest.setReturnUrl("http://www.plentyofeel.com"); // 同步回调跳转的url
        aliRequest.setNotifyUrl("http://www.plentyofeel.com"); // 异步回调的地址，这个才可以真正确认是否支付成功

        // 异步回调的这个函数需要进行如下操作：
        // 1. 验签  --  确认是支付宝回调的这个接口
        // 2. 获取支付状态
        // 3. 对照业务数据 （订单编号, 交易金额, 支付宝流水号[后期对账]）
        // 4. 跟新订单的状态为已支付


        // 通过model来构造业务参数
        AlipayTradePagePayModel model = new AlipayTradePagePayModel();
        model.setOutTradeNo("2015032001099999");
        model.setTotalAmount("88.88");
        model.setProductCode("FAST_INSTANT_TRADE_PAY"); // 测试环境的这个参数得写死
        model.setSubject("橙子");
        aliRequest.setBizModel(model);

        // 通过字符串的方式构造业务参数
//        aliRequest.setBizContent( "{" +
//            "\"out_trade_no\":\"20150320010101001\"," +  // 商户订单编号       最重要的属性    需要存储到数据库
//            "\"total_amount\":88.88," +                  // 交易金额          最重要的属性
//            "\"product_code\":\"FAST_INSTANT_TRADE_PAY\"," +
//            "\"subject\":\"橙子\"," +
//                "}"
//        );


        // 发送请求
        AlipayTradePagePayResponse aliResponse = alipayClient.pageExecute(aliRequest);
        String submitFormData = aliResponse.getBody();


        if(aliResponse.isSuccess()){
            System.out.println("调用成功");
            System.out.println(submitFormData);
        } else {
            System.out.println("调用失败");
        }

        // 将结果输出到页面中
        response.setContentType("text/html;charset=utf-8");
        response.getWriter().write(submitFormData);//直接将完整的表单html输出到页面
        response.getWriter().flush();
        response.getWriter().close();
    }

    // 支付宝支付后同步调用的接口 -- 不能作为支付成功判断的依据
    @GetMapping("paySuccess")
    public ResultBean<TContent> paySuccess() {

        return ResultBean.getSuccessInstance("支付完毕.. ");
    }

    // 改变订单的状态, 支付宝异步调用这个接口, 如果支付成功则修改订单状态
    @PostMapping("changeOrderStatus")
    public void changeOrderStatus() {

    }

}
